; Archivo "hola.asm"
;
; Hola, mundo!
;
;  Envia el texto "Hola, npasm!" a traves del puerto serie.
;
; Compilar: 'npasm hola.asm'
;
%include "p16f877a.inc"

; Definiciones necesarias para calcular el valor de SPBRG
%define BAUD    9600
%define Fosc    4000000

; Macro para calcular el valor de SPBRG (asume que BRGH=1)
; (Ver formula para calcular SPBRG en la hoja de datos).
%define VAL_SPBRG ((Fosc - (16 * BAUD)) / (16 * BAUD)) & 0xFF

;;
;; Seccion de datos
;;
section data
i:  resb 1                ; contador, 1 byte

;;
;; Seccion de codigo
;;
section code
inicio:
	; Configuraciones iniciales
	set   [STATUS].RP0    ; banco 1
	mov   w, 0xFF
	mov   [TRISC], w      ; configurar puerto C
	mov   w, VAL_SPBRG
	mov   [SPBRG], w      ; generador de 'baud rate'
	mov   w, (1<<BRGH | 1<<TXEN) & ~(1<<TX9 | 1<<SYNC)
	mov   [TXSTA], w
	clr   [PIE1].TXIE     ; habilitar transmision
	clr   [STATUS].RP0    ; banco 0
	set   [RCSTA].SPEN    ; habilitar puerto serie

	clr   [i]

bucle:
	mov   w, [i]
	call  mensaje     ; cargamos el caracter del mensaje a mostrar en W
	add   w, 0
	jz    [STATUS].Z
	jmp   $
	call  enviar_w
	inc   [i]
	jmp   bucle

enviar_w:
	mov   [TXREG], w
  enviando:
	jnz   [PIR1].TXIF  ; cuando TXIF=1 salimos
	jmp   enviando
	ret

mensaje:
	add   [pcl], w
	mkretlw  "Hola, mundo!", 0

;;
;; Seccion de configuracion
;;
section config
	dw    _WDT_OFF & _XT_OSC
